home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -screenplay- / hd_installers / -whdload- / whdload_dev / patcher1.04.lha / Patcher1.04 / PARAMQTX / imagernitro.asm < prev    next >
Assembly Source File  |  1997-06-04  |  17KB  |  848 lines

  1. ;another example of a formatconversion, this time for a hd-install
  2. ;the nitro-disk has a really strange decoding-routine
  3. ;have a look on that table-changes while execution
  4.  
  5.     INCDIR    ASM-ONE:INCLUDE2.0/
  6.  
  7.     INCLUDE    OWN/Patcher.I
  8.     INCLUDE    DEVICES/TRACKDISK.I
  9.     INCLUDE    EXEC/EXEC_LIB.I
  10.     INCLUDE    EXEC/IO.I
  11.     INCLUDE    LIBRARIES/DOS_LIB.I
  12.  
  13. MYNITRO=0
  14.  
  15.  
  16. HP    MOVEQ.L    #20,D0
  17.     RTS
  18.     DC.L    TAB
  19.     DC.B    'PTCH'
  20.     DC.B    '$VER:Nitro_Diskimager_V1.1',0
  21.     EVEN
  22.  
  23. TAB    DC.L    PCH_INIT,INITROUT
  24.     DC.L    PCH_FILECOUNT,3
  25.     DC.L    PCH_ADAPTOR,ADNAME
  26.     DC.L    PCH_DISKNAME,DISKNAMEARRAY
  27.     DC.L    PCH_FILENAME,FILENAMEARRAY
  28.     DC.L    PCH_CHANGES,CHANGESARRAY    
  29.     DC.L    PCH_NAME,PARAMNAME
  30.     DC.L    PCH_DATALENGTH,LENGTHTABLE
  31.     DC.L    PCH_SPECIAL,SPECIALARRAY
  32.     DC.L    PCH_STATE,STATEARRAY
  33.     DC.L    PCH_STATE2,STATEARRAY2
  34.     DC.L    PCH_MINVERSION,VERSNAME        ;minimum version of THE PATCHER
  35.     DC.L    0
  36.  
  37. ;minimum version of the patcher required, its a commandline-parameter
  38. VERSNAME    DC.B    'V1.01'        ;MAY NOT CONTAIN HEADING ZEROES
  39.     EVEN                ;MUST CONTAIN 2 NUMBERS AFTER POINT
  40.  
  41.  
  42. ADNAME    DC.B    'Done by Harry.',0
  43.     EVEN
  44.  
  45.  
  46. PARAMNAME    DC.B    'Nitro, Diskimager for HD-install',0
  47.     EVEN
  48.  
  49.  
  50. DISKNAMEARRAY    DC.L    DISK1NAME
  51.     DC.L    DISK1NAME
  52.     DC.L    DISK1NAME
  53.  
  54. DISK1NAME    DC.B    'Nitro',0
  55.     EVEN
  56.  
  57.  
  58. FILENAMEARRAY    DC.L    FILE1NAME
  59.     DC.L    FILE2NAME
  60.     DC.L    FILE3NAME
  61.  
  62. FILE2NAME    DC.B    'disk.1',0
  63.     EVEN
  64. FILE1NAME    DC.B    'init',0
  65.     EVEN
  66. FILE3NAME    DC.B    'high',0
  67.     EVEN
  68.  
  69. LENGTHTABLE    DC.L    $1200
  70.     DC.L    $0            ;WILL BE EVALUATED IN CYCLE1
  71.     DC.L    $140            ;HIGHSCORE!
  72.  
  73. CHANGESARRAY    DC.L    0        ;no changes to make in cycle 1
  74.     DC.L    0            ;no changes to make in cycle 2
  75.     DC.L    0            ;if no highscores were on disk,
  76.                     ;they will be generated
  77.  
  78. ;the parameter-initializing opens sourcedevice 
  79. INITROUT
  80.     MOVEQ.L    #0,D0
  81.     MOVE.L    PTB_OPENDEVICE(A5),A0
  82.     JSR    (A0)
  83.     TST.L    D0
  84.     RTS
  85.  
  86. ;loading-statetexts for the cycles
  87. STATEARRAY    DC.L    LOADSTATE2
  88.     DC.L    LOADSTATE2
  89.     DC.L    LOADSTATE2
  90.  
  91.  
  92. LOADSTATE2
  93.     DC.B    'Please insert your original writepro-',$A
  94.     DC.B    'tected disk in the source drive.',0
  95.     EVEN
  96.  
  97. STATEARRAY2    DC.L    SAVESTATE        ;no text in cycle 1
  98.     DC.L    SAVESTATE
  99.     DC.L    SAVESTATE
  100.  
  101.  
  102. SAVESTATE    
  103.     DC.B    'Please insert your destination disk.',0
  104.     EVEN
  105.  
  106. ;routines to 'load' something
  107. SPECIALARRAY    DC.L    LOADROUT2    ;load dual-formatted track 0
  108.     DC.L    LOADROUT        ;load stuff from original
  109.     DC.L    LOADROUT3        ;load highscore
  110.  
  111. LOADROUT2
  112.     MOVEQ.L    #0,D7
  113. .NEU
  114. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  115.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  116.     MOVE.L    (_SYSBASE).W,A6
  117.     JSR    _LVODOIO(A6)
  118.     TST.L    IO_ACTUAL(A1)
  119.     BNE.W    .NOTORG
  120.  
  121.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  122.     MOVE.L    PTB_ADDRESSOFFILE(A5),IO_DATA(A1)
  123.     MOVE.L    #$1200,IO_LENGTH(A1)
  124.     MOVE.L    #$400,IO_OFFSET(A1)
  125.     MOVE.W    #CMD_READ,IO_COMMAND(A1)
  126.     CLR.L    IOTD_SECLABEL(A1)
  127.     MOVE.L    (_SYSBASE).W,A6
  128.     JSR    _LVODOIO(A6)
  129.     TST.L    D0
  130.     BNE.W    .ERR
  131.  
  132.                     ;LOAD CHECKDISKTRACK
  133.     MOVEQ.L    #0,D2
  134.     LEA.L    TRACKDATALENGTH(PC),A2
  135.     MOVEQ.L    #0,D4
  136.  
  137. .3    TST.L    D4
  138.     BNE.S    .1
  139.  
  140.  
  141. .5    MOVEQ.L    #$4,D5                ;4 tries, then error
  142. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  143.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  144.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  145.                         ;to decode the index-sync-read data
  146.     MOVE.L    D2,D0                ;my own trackcounter
  147.     MOVE.L    D0,IO_OFFSET(A1)
  148.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  149.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  150.     MOVE.L    (_SYSBASE).W,A6
  151.     JSR    _LVODOIO(A6)
  152.     TST.L    D0
  153.     BNE.W    .ERR
  154.     MOVE.L    PTB_SPACE(A5),A0
  155.     LEA.L    $7C00(A0),A1            ;end of buffer
  156.     LEA.L    $7C02(A0),A3
  157.     BSR.W    TRACKDECODE3
  158.     TST.L    D0
  159.     BEQ.S    .OK
  160.     DBF    D5,.55
  161.     BRA.W    .NOTORG
  162.  
  163. .OK
  164.     CMP.L    #'tb_1',(A3)            ;nitro-diskname
  165.     BNE.S    .ERR
  166.  
  167.     LEA.L    $8(A3),A3
  168.     MOVE.L    #$A0,D3
  169.  
  170. .1    MOVE.L    D4,D0
  171.     LSL.L    #1,D0
  172.     MOVE.W    (A3,D0.W),D0
  173.     AND.W    #$FFF,D0
  174.     MOVE.W    D0,(A2)+
  175.     ADDQ.L    #1,D4
  176.     CMP.W    D3,D4                ;tracklength
  177.     BNE.S    .2
  178.     MOVEQ.L    #0,D4                ;new track
  179. .2
  180.     TST.L    D4
  181.     BNE.S    .3
  182.  
  183.     LEA.L    TRACKDATALENGTH,A0        ;evaluate disksize needed in
  184.     MOVEQ.L    #0,D0                ;next cycle (cycle 2)
  185. .T1    MOVEQ.L    #0,D1
  186.     MOVE.W    (A0)+,D1
  187.     ADD.L    D1,D0
  188.     CMP.L    #TRACKDATALENGTHEND,A0
  189.     BNE.S    .T1
  190.     LSL.L    #2,D0
  191.     MOVE.L    D0,LENGTHTABLE+4        ;store length in right table
  192. ;            ^-^-^-^-^-^
  193.  
  194.     MOVEQ.L    #0,D4
  195. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  196.     MOVE.L    #0,IO_LENGTH(A1)
  197.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  198.     MOVE.L    (_SYSBASE).W,A6
  199.     JSR    _LVODOIO(A6)
  200.  
  201.     MOVE.L    D4,D0
  202.     RTS
  203.  
  204. .ERR    MOVEQ.L    #-1,D4
  205.     BRA.S    .END
  206.  
  207. .NOTORG    TST.L    D7
  208.     BNE.S    .ERR
  209.     ST    D7
  210.     LEA.L    LINE1(PC),A0
  211.     LEA.L    LINE2(PC),A1
  212.     MOVE.L    PTB_REQUEST(A5),A6
  213.     JSR    (A6)
  214.     TST.L    D0
  215.     BNE.S    .ERR
  216.     BRA.W    .NEU
  217.  
  218.  
  219. LOADROUT
  220. ;.xxx    bra.s    .xxx
  221.     MOVEQ.L    #0,D7                ;one diskchange allowed
  222. .NEU
  223. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  224.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  225.     MOVE.L    (_SYSBASE).W,A6
  226.     JSR    _LVODOIO(A6)
  227.     TST.L    IO_ACTUAL(A1)
  228.     BNE.W    .NOTORG
  229.  
  230.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  231.     LEA.L    (A4),A2            ;offset to load in the dataspace
  232.     MOVEQ.L    #0,D2                ;starttrack on the disk
  233.     MOVEQ.L    #0,D4                ;data from the start of the track
  234. ;    bra.s    .5                ;because reading starts with
  235.                         ;trackstart, this is obsolete
  236.  
  237. .3    TST.L    D4
  238.     BNE.W    .1
  239.     MOVE.L    D2,D0
  240.     LSL.L    #1,D0
  241.     LEA.L    TRACKDATALENGTH(PC),A0
  242.     TST.W    (A0,D0.W)
  243.     BEQ.W    .SKIPEMPTY
  244.  
  245. .5    MOVEQ.L    #$4,D5                ;4 tries, then error
  246. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  247.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  248.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  249.                         ;to decode the index-sync-read data
  250.     MOVE.L    D2,D0                ;my own trackcounter
  251.     MOVE.L    D0,IO_OFFSET(A1)
  252.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  253.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  254.     MOVE.L    (_SYSBASE).W,A6
  255.     JSR    _LVODOIO(A6)
  256.     TST.L    D0
  257.     BNE.W    .ERR
  258.     MOVE.L    #$AAAAAAAA,ANDVALUE
  259.     MOVE.L    PTB_SPACE(A5),A0
  260.     LEA.L    $7C00(A0),A1            ;end of buffer
  261.     LEA.L    $7C00(A0),A3
  262.     BSR.W    TRACKDECODE2
  263.     TST.L    D0
  264.     BEQ.S    .R1OK
  265.     MOVE.L    #$55555555,ANDVALUE
  266.     MOVE.L    PTB_SPACE(A5),A0
  267.     LEA.L    $7C00(A0),A1            ;end of buffer
  268.     LEA.L    $7C00(A0),A3
  269.     BSR.W    TRACKDECODE2
  270.     TST.L    D0
  271.     BEQ.S    .R1OK
  272.     DBF    D5,.55
  273.     BRA.W    .NOTORG
  274.  
  275. .R1OK    MOVE.W    D1,D3
  276.     LSL.W    #2,D3
  277.     ST    D7                ;correct disk - nothing anymore
  278.                         ;to change
  279. .1    MOVE.B    (A3,D4.W),(A2)+
  280.     ADDQ.L    #1,D4
  281.     CMP.W    D3,D4                ;tracklength
  282.     BNE.S    .2
  283. .SKIPEMPTY
  284.     MOVEQ.L    #0,D4                ;new track
  285.     ADDQ.L    #1,D2
  286. .2
  287.     TST.L    D4
  288.     BNE.W    .3
  289.     CMP.L    #$A0,D2                ;UNTIL END OF DISK IS REACHED
  290.     BNE.W    .3
  291.  
  292.     MOVEQ.L    #0,D4
  293. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  294.     MOVE.L    #0,IO_LENGTH(A1)
  295.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  296.     MOVE.L    (_SYSBASE).W,A6
  297.     JSR    _LVODOIO(A6)
  298.  
  299.     MOVE.L    D4,D0
  300.     RTS
  301.  
  302. .ERR    MOVEQ.L    #-1,D4
  303.     BRA.S    .END
  304.  
  305. .NOTORG    TST.L    D7            ;if the first time the original
  306.     BNE.S    .ERR            ;was not in the source drive,
  307.     ST    D7            ;youll be asked to put it there
  308.     LEA.L    LINE1(PC),A0
  309.     LEA.L    LINE2(PC),A1
  310.     MOVE.L    PTB_REQUEST(A5),A6
  311.     JSR    (A6)
  312.     TST.L    D0
  313.     BNE.S    .ERR
  314.     BRA.W    .NEU
  315.  
  316.  
  317. LOADROUT3
  318.     MOVEQ.L    #0,D7                ;one diskchange allowed
  319. .NEU
  320. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  321.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  322.     MOVE.L    (_SYSBASE).W,A6
  323.     JSR    _LVODOIO(A6)
  324.     TST.L    IO_ACTUAL(A1)
  325.     BNE.W    .NOTORG
  326.  
  327.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  328.     LEA.L    (A4),A2            ;offset to load in the dataspace
  329.     MOVEQ.L    #2,D2                ;starttrack on the disk
  330.     MOVEQ.L    #0,D4                ;data from the start of the track
  331. ;    bra.s    .5                ;because reading starts with
  332.                         ;trackstart, this is obsolete
  333.  
  334. .3    TST.L    D4
  335.     BNE.W    .1
  336. .5    MOVEQ.L    #$4,D6                ;4 tries, then error
  337. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  338.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  339.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  340.                         ;to decode the index-sync-read data
  341.     MOVE.L    D2,D0                ;my own trackcounter
  342.     MOVE.L    D0,IO_OFFSET(A1)
  343.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  344.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  345.     MOVE.L    (_SYSBASE).W,A6
  346.     JSR    _LVODOIO(A6)
  347.     TST.L    D0
  348.     BNE.W    .ERR
  349.     MOVE.L    PTB_SPACE(A5),A0
  350.     LEA.L    $7C00(A0),A1            ;end of buffer
  351.     LEA.L    $7C02(A0),A3            ;due checksum
  352.     BSR.W    TRACKDECODE
  353.     TST.L    D0
  354.     BEQ.S    .R1OK
  355.     DBF    D6,.55
  356.     BRA.W    .NOTORG
  357.  
  358. .R1OK    MOVE.W    #$140,D3
  359.     ADDQ.L    #1,D2
  360.     ST    D7                ;correct disk - nothing anymore
  361.                         ;to change
  362. .1    MOVE.B    (A3,D4.W),(A2)+
  363.     ADDQ.L    #1,D4
  364.     CMP.W    D3,D4                ;tracklength
  365.     BNE.S    .2
  366.     MOVEQ.L    #0,D4                ;new track
  367. .2
  368.     TST.L    D4
  369.     BNE.W    .3
  370.     CMP.L    #$3,D2                ;UNTIL TRACK $3 IS REACHED
  371.     BNE.W    .3
  372.  
  373.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;check if highscores were saved
  374.     MOVE.W    #$140-1,d0
  375. .H2    TST.B    (A4)+
  376.     BNE.S    .H
  377.     DBF    D0,.H2
  378.     MOVE.L    #HITAB,CHANGESARRAY+2*4        ;if not, generate them
  379. .H
  380.     MOVEQ.L    #0,D4
  381. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  382.     MOVE.L    #0,IO_LENGTH(A1)
  383.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  384.     MOVE.L    (_SYSBASE).W,A6
  385.     JSR    _LVODOIO(A6)
  386.  
  387.     MOVE.L    D4,D0
  388.     RTS
  389.  
  390. .ERR    MOVEQ.L    #0,D4                ;ignore error
  391.     MOVE.L    #HITAB,CHANGESARRAY+2*4        ;generate highscores
  392. ;            ^-^-^-^-^-^-^-^
  393.     BRA.S    .END
  394.  
  395. .NOTORG    TST.L    D7            ;if the first time the original
  396.     BNE.S    .ERR            ;was not in the source drive,
  397.     ST    D7            ;youll be asked to put it there
  398.     LEA.L    LINE1(PC),A0
  399.     LEA.L    LINE2(PC),A1
  400.     MOVE.L    PTB_REQUEST(A5),A6
  401.     JSR    (A6)
  402.     TST.L    D0
  403.     BNE.S    .ERR
  404.     BRA.W    .NEU
  405.  
  406. LINE1    DC.B    'Please insert your original',0
  407.     EVEN
  408. LINE2    DC.B    'in the source drive.',0
  409.     EVEN
  410.  
  411. ;< A0 RAWTRACK
  412. ;< A1 TRACKBUFFER
  413. ;> D0 ERROR
  414.  
  415.  
  416. GETSYNC
  417. ;SYNCANFANG SUCHEN
  418. .SHF2    MOVEQ.L    #$10-1,D5
  419. .SHF1    MOVE.L    (A0),D0
  420.     LSR.L    D5,D0
  421.     CMP.W    #$4429,D0    ;NITRO HAS $4429 AS SYNC
  422.     BEQ.S    .SY
  423.     DBF    D5,.SHF1
  424.     ADDQ.L    #2,A0
  425.     CMP.L    A0,A4
  426.     BHI.S    .SHF2
  427.     BRA.S    .ERR
  428. .SY    
  429.     MOVE.L    (A0),D0
  430.     ADDQ.L    #2,A0
  431.     LSR.L    D5,D0
  432.     CMP.W    #$4429,D0
  433.     BNE.S    .SY
  434.  
  435. .1    MOVE.L    (A0),D0
  436.     ADDQ.L    #2,A0
  437.     LSR.L    D5,D0
  438.     CMP.W    #$4429,D0
  439.     BEQ.S    .1
  440.     SUBQ.L    #2,A0
  441.     CMP.L    A0,A4
  442.     BLS.S    .ERR
  443.     MOVEQ.L    #0,D0
  444.     RTS
  445.  
  446. .ERR    MOVEQ.L    #-1,D0
  447.     RTS
  448.  
  449. GETSYNC2
  450. ;SYNCANFANG SUCHEN
  451. .SHF2    MOVEQ.L    #$10-1,D5
  452. .SHF1    MOVE.L    (A0),D0
  453.     LSR.L    D5,D0
  454.     CMP.W    #$428A,D0    ;NITRO-DISKCHECKTRACK HAS $428A AS SYNC
  455.     BEQ.S    .SY
  456.     DBF    D5,.SHF1
  457.     ADDQ.L    #2,A0
  458.     CMP.L    A0,A4
  459.     BHI.S    .SHF2
  460.     BRA.S    .ERR
  461. .SY    
  462.     MOVE.L    (A0),D0
  463.     ADDQ.L    #2,A0
  464.     LSR.L    D5,D0
  465.     CMP.W    #$428A,D0
  466.     BNE.S    .SY
  467.  
  468. .1    MOVE.L    (A0),D0
  469.     ADDQ.L    #2,A0
  470.     LSR.L    D5,D0
  471.     CMP.W    #$428A,D0
  472.     BEQ.S    .1
  473.     SUBQ.L    #2,A0
  474.     CMP.L    A0,A4
  475.     BLS.S    .ERR
  476.     MOVEQ.L    #0,D0
  477.     RTS
  478.  
  479. .ERR    MOVEQ.L    #-1,D0
  480.     RTS
  481.  
  482. ;    IFEQ    1
  483.  
  484. ;< A0 RAWTRACK
  485. ;< A1 TRACKBUFFER
  486. ;> D0 ERROR
  487. ;INTERN
  488. ;  D5 SHIFT-COUNT
  489. ;  D4 #$55555555
  490. ;track contains 1 WORD CHECKSUM, THEN $A6 WORDS
  491.  
  492. TRACKDECODE3    MOVEM.L    A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
  493.     MOVE.L    A0,A3
  494.     MOVE.L    A1,A2
  495.     LEA.L    ($7C00-2*$18A0)(A0),A4    ;LAST CHANCE FOR CORRECT SYNC
  496.  
  497.     MOVE.L    #$55555555,D4
  498.     BSR.W    GETSYNC2
  499.     TST.L    D0
  500.     BNE.W    .ERR
  501.  
  502.     SUBQ.L    #2,A0        ;DUE MY LONGWORD-READER
  503.  
  504.     MOVE.W    #$A6,D7        ;decodes $A7 WORDS
  505. .1
  506. ;    MOVE.L    (A0)+,D2    ;ORIGINAL CODE
  507.                 ;my code to get a longword
  508.     MOVE.L    (A0)+,D2    ;get higher part
  509.     MOVE.L    (A0),D6        ;get lower part
  510.     LSR.L    D5,D6        ;shift lower part with count
  511.     MOVEQ.L    #$20,D1        ;higher part has to be shifted to fill
  512.                 ;the rest-place, a longword has 20 bits
  513.     SUB.L    D5,D1
  514.     LSL.L    D1,D2
  515.     OR.L    D6,D2        ;my code ends
  516.  
  517.     ANDI.L    D4,D2
  518.     MOVE.L    D2,D3
  519.     SWAP    D3
  520.     ADD.W    D3,D3
  521.     OR.W    D3,D2
  522.     MOVE.W    D2,(A2)+
  523.     DBF    D7,.1
  524.  
  525.     MOVE.L    A1,A2
  526.     MOVE.W    (A2)+,D3
  527.     MOVE.W    #$14C,D6
  528.     BSR.W    CHECKSUM
  529.     CMP.W    D2,D3
  530.     BNE.S    .ERR
  531.  
  532.     MOVEQ.L    #0,D0
  533. .END
  534.     MOVEM.L    (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
  535.     RTS
  536. .ERR
  537.     MOVEQ.L    #-1,D0
  538.     BRA.S    .END
  539.  
  540. TRACKDECODE    MOVEM.L    A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
  541.     MOVE.L    A0,A3
  542.     MOVE.L    A1,A2
  543.     LEA.L    ($7C00-2*$18A0)(A0),A4    ;LAST CHANCE FOR CORRECT SYNC
  544.  
  545.     MOVE.L    #$55555555,D4
  546.     BSR.W    GETSYNC
  547.     TST.L    D0
  548.     BNE.W    .ERR
  549.  
  550.     SUBQ.L    #2,A0        ;DUE MY LONGWORD-READER
  551.  
  552.     MOVE.W    #$0626,D7    ;decodes $627*4=$189c bytes
  553. .1
  554. ;    MOVE.L    (A0)+,D0
  555.                 ;my code to get a longword
  556.                 ;that it works, a2 has to point 2 bytes
  557.                 ;before the real location! (see
  558.                 ;subq #2,a0 before)
  559.     MOVE.L    (A0)+,D0    ;get higher part
  560.     MOVE.L    (A0),D6        ;get lower part
  561.     LSR.L    D5,D6        ;shift lower part with count
  562.     MOVEQ.L    #$20,D2        ;higher part has to be shifted to fill
  563.                 ;the rest-place, a longword has 20 bits
  564.     SUB.L    D5,D2
  565.     LSL.L    D2,D0
  566.     OR.L    D6,D0        ;my code ends
  567.  
  568. ;    MOVE.L    (A0)+,D1
  569.                 ;my code to get a longword
  570.     MOVE.L    (A0)+,D1    ;get higher part
  571.     MOVE.L    (A0),D6        ;get lower part
  572.     LSR.L    D5,D6        ;shift lower part with count
  573.     MOVEQ.L    #$20,D2        ;higher part has to be shifted to fill
  574.                 ;the rest-place, a longword has 20 bits
  575.     SUB.L    D5,D2
  576.     LSL.L    D2,D1
  577.     OR.L    D6,D1        ;my code ends
  578.  
  579.     AND.L    D4,D0
  580.     AND.L    D4,D1
  581.     ADD.L    D0,D0
  582.     OR.L    D1,D0
  583.     MOVE.L    D0,(A2)+
  584.     DBF    D7,.1
  585.     MOVEQ    #$01,D3
  586.  
  587.     MOVE.L    A1,A2
  588.     MOVE.W    (A2)+,D3
  589.     MOVE.W    #$189A,D6
  590.     BSR.W    CHECKSUM
  591.     CMP.W    D2,D3
  592.     BNE.S    .ERR
  593. ;    LSR.W    #1,D6
  594. ;    SUBQ.W    #1,D6
  595. ;.2    MOVE.W    (A1)+,(Ax)+
  596. ;    SUBQ.L    #1,D0
  597. ;    DBLE    D6,.2
  598. ;    CMP.W    D0,D0
  599.  
  600.     MOVEQ.L    #0,D0
  601. .END
  602.     MOVEM.L    (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
  603.     RTS
  604. .ERR
  605.     MOVEQ.L    #-1,D0
  606.     BRA.S    .END
  607.  
  608.  
  609. CHECKSUM
  610.     MOVEM.L    D1/D6/A1,-(A7)
  611.     LSR.W    #1,D6
  612.     MOVEQ    #-$01,D2
  613.     ADD.W    D2,D2
  614.     BRA.B    .1
  615.  
  616. .2    MOVE.W    (A2)+,D1
  617.     ADDX.W    D1,D2
  618. .1    DBF    D6,.2
  619.     MOVEM.L    (A7)+,D1/D6/A1
  620.     RTS    
  621.  
  622. ;    ENDC
  623.  
  624.  
  625. ;LB_FFF4    DC.L    $AAAAAAAA
  626. ;    DC.L    $55555555
  627. ;    DC.W    $4429
  628.  
  629. ;< A0 RAWTRACK
  630. ;< A1 TRACKBUFFER
  631. ;> D0 ERROR
  632. ;INTERN
  633. ;  D5 SHIFT-COUNT
  634. ;  D4 #$55555555
  635.  
  636. ANDVALUE    DC.L    $AAAAAAAA
  637.  
  638. TRACKDECODE2    MOVEM.L    A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
  639.     LEA.L    ($7C00-2*$1A00)(A0),A4    ;LAST CHANCE FOR CORRECT SYNC
  640.     MOVE.L    D2,D7        ;SAVE ACTUAL TRACK-#
  641.  
  642.     MOVE.L    #$55555555,D4
  643.     BSR.W    GETSYNC
  644.     TST.L    D0
  645.     BNE.W    .ERR
  646.  
  647.     SUBQ.L    #2,A0        ;DUE MY LONGWORD-READER
  648.     MOVE.L    D5,A4
  649.  
  650.  
  651. ;    MOVE.L    (A0)+,D5    ;CHECKSUM2
  652.     BSR.W    MYLONGWORD
  653.     MOVE.L    D0,D5
  654.     ANDI.L    #$55555555,D5
  655.     MOVE.W    D5,D1
  656.     SWAP    D5
  657.     ADD.W    D5,D5
  658.     OR.W    D1,D5
  659. ;    MOVE.B    $B(A3),D0    ;??? 0
  660. ;    ANDI.W    #$0001,D0
  661. ;    ADD.W    D0,D0
  662. ;    ADD.W    D0,D0
  663. ;    LEA    LB_FFF4(PC),A2
  664. ;    MOVE.L    (A2,D0.W),D1    ;DATA-AND
  665.     MOVE.L    ANDVALUE(PC),D1    ;REPLACEMENT FOR 6 LINES BEFORE
  666.  
  667. ;    MOVEQ    #$00,D0
  668. ;    MOVE.B    $0009(A3),D0    ;TRACK-#
  669.     MOVE.L    D7,D0
  670.     ADD.W    D0,D0
  671. ;    LEA    $001E(A3),A2
  672.     LEA.L    TRACKDATALENGTH(PC),A2
  673.     MOVE.W    (A2,D0.W),D7
  674. ;    MOVE.L    A1,A2
  675.     MOVEM.L    D5/D7,-(A7)
  676.     BSR.W    LB_0062
  677.     MOVEM.L    (A7)+,D5/D7
  678.     MOVE.W    D6,D2
  679.     SWAP    D6
  680.     EOR.W    D6,D2
  681.     ANDI.W    #$FFF0,D2
  682.     MOVE.W    D7,D1
  683.     CMP.W    D2,D5
  684.     BNE.S    .ERR
  685. ;    MOVEM.L    (A7)+,D1-A6
  686.     MOVEQ.L    #0,D0
  687. .END
  688.     MOVEM.L    (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
  689.     RTS
  690. .ERR
  691.     MOVEQ.L    #-1,D0
  692.     BRA.S    .END
  693.     RTS    
  694.  
  695. LB_0062    MOVEQ    #$1F,D2
  696.     MOVEQ    #$1F,D4
  697.     MOVEQ    #$00,D3
  698.     MOVEQ    #$00,D6
  699.     SUBQ.W    #1,D7
  700.     MOVEQ    #$1F,D5
  701. LB_006E    TST.W    $0002(A0)
  702.     BEQ.B    LB_006E
  703. ;    MOVE.L    (A0)+,D0
  704.     BSR.S    MYLONGWORD
  705.     BTST    D4,D0
  706.     BEQ.B    LB_00A2
  707.  
  708. LB_007A    ADD.L    D3,D3
  709.     ADDQ.W    #1,D3
  710.     DBF    D5,LB_0090
  711.     EOR.L    D1,D3
  712.     ADD.L    D3,D6
  713.     MOVE.L    D3,(A1)+
  714.     DBF    D7,LB_008E
  715.  
  716.     BRA.B    LB_00F0
  717.  
  718. LB_008E    MOVEQ    #$1F,D5
  719. LB_0090    SUBQ.W    #2,D4
  720.     BPL.B    LB_009E
  721.  
  722.     AND.W    D2,D4
  723. LB_0096    TST.W    $0002(A0)
  724.     BEQ.B    LB_0096
  725. ;    MOVE.L    (A0)+,D0
  726.     BSR.S    MYLONGWORD
  727. LB_009E    BTST    D4,D0
  728.     BNE.B    LB_007A
  729. LB_00A2    ADD.L    D3,D3
  730.     DBF    D5,LB_00B6
  731.  
  732.     EOR.L    D1,D3
  733.     ADD.L    D3,D6
  734.     MOVE.L    D3,(A1)+
  735.     DBF    D7,LB_00B4
  736.     BRA.B    LB_00F0
  737. LB_00B4    MOVEQ    #$1F,D5
  738. LB_00B6    DBF    D4,LB_00C4
  739.     MOVEQ    #$1F,D4
  740. LB_00BC    TST.W    $0002(A0)
  741.     BEQ.B    LB_00BC
  742. ;    MOVE.L    (A0)+,D0
  743.     BSR.S    MYLONGWORD
  744. LB_00C4    BTST    D4,D0
  745.     BNE.B    LB_007A
  746.     ADD.L    D3,D3
  747.     DBF    D5,LB_00DC
  748.     EOR.L    D1,D3
  749.     ADD.L    D3,D6
  750.     MOVE.L    D3,(A1)+
  751.     DBF    D7,LB_00DA
  752.     BRA.B    LB_00F0
  753.  
  754. LB_00DA    MOVEQ    #$1F,D5
  755. LB_00DC    SUBQ.W    #3,D4
  756.     BPL.B    LB_00EA
  757.     AND.W    D2,D4
  758. LB_00E2    TST.W    $0002(A0)
  759.     BEQ.B    LB_00E2
  760. ;    MOVE.L    (A0)+,D0
  761.     BSR.S    MYLONGWORD
  762. LB_00EA    BTST    D4,D0
  763.     BNE.B    LB_007A
  764.     BEQ.B    LB_00A2
  765.  
  766. LB_00F0    RTS    
  767.  
  768. ;    ORI.B    #$90,D0
  769. ;    ADDA.L    #$00000008,A0
  770. ;    DBF    D7,LB_00F4
  771. ;    RTS    
  772.  
  773.  
  774. MYLONGWORD                ;my code to get a longword
  775.     
  776.     MOVEM.L    D5/D6/D2,-(A7)
  777.     MOVE.L    A4,D5
  778.     MOVE.L    (A0)+,D0    ;get higher part
  779.     MOVE.L    (A0),D6        ;get lower part
  780.     LSR.L    D5,D6        ;shift lower part with count
  781.     MOVEQ.L    #$20,D2        ;higher part has to be shifted to fill
  782.                 ;the rest-place, a longword has 20 bits
  783.     SUB.L    D5,D2
  784.     LSL.L    D2,D0
  785.     OR.L    D6,D0        ;my code ends
  786.     MOVEM.L    (A7)+,D5/D6/D2
  787.     RTS
  788.  
  789. TRACKDATALENGTH
  790.     DS.W    $A0
  791. TRACKDATALENGTHEND
  792.     DC.W    0
  793.  
  794. HITAB
  795.     DC.B    $00,$80,$00,$02,$05,$1F,$40,$4D
  796.     DC.B    $41,$4A,$00,$80,$00,$0A,$05,$1B
  797.     DC.B    $58,$52,$41,$59,$00,$80,$00,$12
  798.     DC.B    $05,$17,$70,$53,$41,$52,$00,$80
  799.     DC.B    $00,$1A,$05,$13,$88,$4A,$46,$57
  800.     DC.B    $00,$80,$00,$22,$05,$0F,$A0,$43
  801.     DC.B    $53,$57,$00,$80,$00,$2A,$05,$0B
  802.     DC.B    $B8,$4E,$45,$54,$00,$80,$00,$32
  803.     DC.B    $05,$07,$D0,$49,$41,$4E,$00,$80
  804.     DC.B    $00,$3A,$05,$03,$E8,$53,$56,$52
  805.     DC.B    $00,$80,$00,$42,$05,$17,$70,$20
  806.     DC.B    $20,$20,$00,$80,$00,$4A,$05,$17
  807.     DC.B    $70,$20,$20,$20,$00,$80,$00,$52
  808.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  809.     DC.B    $00,$5A,$05,$17,$70,$20,$20,$20
  810.     DC.B    $00,$80,$00,$62,$05,$17,$70,$20
  811.     DC.B    $20,$20,$00,$80,$00,$6A,$05,$17
  812.     DC.B    $70,$20,$20,$20,$00,$80,$00,$72
  813.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  814.     DC.B    $00,$7A,$05,$17,$70,$20,$20,$20
  815.     DC.B    $00,$80,$00,$82,$05,$17,$70,$20
  816.     DC.B    $20,$20,$00,$80,$00,$8A,$05,$17
  817.     DC.B    $70,$20,$20,$20,$00,$80,$00,$92
  818.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  819.     DC.B    $00,$9A,$05,$17,$70,$20,$20,$20
  820.     DC.B    $00,$80,$00,$A2,$05,$17,$70,$20
  821.     DC.B    $20,$20,$00,$80,$00,$AA,$05,$17
  822.     DC.B    $70,$20,$20,$20,$00,$80,$00,$B2
  823.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  824.     DC.B    $00,$BA,$05,$17,$70,$20,$20,$20
  825.     DC.B    $00,$80,$00,$C2,$05,$17,$70,$20
  826.     DC.B    $20,$20,$00,$80,$00,$CA,$05,$17
  827.     DC.B    $70,$20,$20,$20,$00,$80,$00,$D2
  828.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  829.     DC.B    $00,$DA,$05,$17,$70,$20,$20,$20
  830.     DC.B    $00,$80,$00,$E2,$05,$17,$70,$20
  831.     DC.B    $20,$20,$00,$80,$00,$EA,$05,$17
  832.     DC.B    $70,$20,$20,$20,$00,$80,$00,$F2
  833.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  834.     DC.B    $00,$FA,$05,$17,$70,$20,$20,$20
  835.     DC.B    $00,$80,$01,$02,$05,$17,$70,$20
  836.     DC.B    $20,$20,$00,$80,$01,$0A,$05,$17
  837.     DC.B    $70,$20,$20,$20,$00,$80,$01,$12
  838.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  839.     DC.B    $01,$1A,$05,$17,$70,$20,$20,$20
  840.     DC.B    $00,$80,$01,$22,$05,$17,$70,$20
  841.     DC.B    $20,$20,$00,$80,$01,$2A,$05,$17
  842.     DC.B    $70,$20,$20,$20,$00,$80,$01,$32
  843.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  844.     DC.B    $01,$3A,$05,$17,$70,$20,$20,$20
  845.     DC.B    $00,$40,$00,$00
  846.  
  847.  
  848.